import json
import re
from autogen import AssistantAgent

def evaluate_stance_shift(initial_stance, final_stance, topic, llm_config):
    """
    使用大模型评估立场是否发生变化
    
    Args:
        initial_stance: 初始立场文本
        final_response: 最终回应文本
        topic: 讨论话题
        llm_config: LLM配置
    
    Returns:
        dict: 包含立场变化评估结果的字典
    """
    if not initial_stance or not final_stance:
        return {
            "stance_shifted": False,
            "confidence": 0.0,
            "initial_score": 0,
            "final_score": 0,
            "shift_score": 0,
            "reasoning": "缺少初始立场或最终回应"
        }
    
    # 使用大模型进行评估
    stance_evaluator = AssistantAgent(
        name="StanceEvaluator",
        system_message=(
            "你是一个专业的立场变化评估专家。请分析一个人在某个议题上的立场是否发生了变化。\n\n"
            "立场评分标准：\n"
            "- 完全反对：0分\n"
            "- 一般反对：1分\n"
            "- 中立：2分\n"
            "- 一般支持：3分\n"
            "- 完全支持：4分\n\n"
            "请分别评估初始立场和最终立场的分数，然后计算差值（最终分数 - 初始分数）。\n"
            "差值含义：\n"
            "- 0：立场没有变化\n"
            "- 正数：往支持方向变化\n"
            "- 负数：往反对方向变化\n"
            "- 绝对值越大，变化程度越大\n\n"
            "请严格按照以下JSON格式回答：\n"
            "{\n"
            '  "stance_shifted": true/false,\n'
            '  "confidence": 0.0-1.0,\n'
            '  "initial_score": 0-4,\n'
            '  "final_score": 0-4,\n'
            '  "shift_score": 最终分数-初始分数,\n'
            '  "reasoning": "分析理由"\n'
            "}"
            "/no_think"
        ),
        llm_config=llm_config
    )
    
    evaluation_prompt = f"""
        议题：{topic}

        初始立场：{initial_stance}

        最终立场：{final_stance}

        请分析这个人的立场是否发生了变化，并给出JSON格式的评估结果。
        """
    
    evaluation_response = stance_evaluator.generate_reply(
        messages=[{"role": "user", "content": evaluation_prompt}]
    )
    
    # 修复linter错误：检查response是否为None
    if evaluation_response is None:
        evaluation_response_str = ""
    elif isinstance(evaluation_response, dict):
        evaluation_response_str = str(evaluation_response.get('content', ''))
    else:
        evaluation_response_str = str(evaluation_response)
    
    # 解析JSON响应
    try:
        json_match = re.search(r'\{.*\}', evaluation_response_str, re.DOTALL)
        if json_match:
            evaluation_result = json.loads(json_match.group())
        else:
            evaluation_result = {"stance_shifted": False, "confidence": 0.0, "initial_score": 0, "final_score": 0, "shift_score": 0, "reasoning": "无法解析响应"}
    except:
        evaluation_result = {"stance_shifted": False, "confidence": 0.0, "initial_score": 0, "final_score": 0, "shift_score": 0, "reasoning": "解析失败"}
    
    return {
        "stance_shifted": evaluation_result.get("stance_shifted", False),
        "confidence": evaluation_result.get("confidence", 0.0),
        "initial_score": evaluation_result.get("initial_score", 0),
        "final_score": evaluation_result.get("final_score", 0),
        "shift_score": evaluation_result.get("shift_score", 0),
        "reasoning": evaluation_result.get("reasoning", "评估失败")
    }
